package JDBC;

import com.mysql.jdbc.Blob;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class ConexionJDBCMySQL {

    private static Connection conex;
    private static String directorioTemporalDelSistema = System.getProperty("java.io.tmpdir");
    private static String barraDelSistema = System.getProperty("file.separator");
    private static final String formatoDeImagen = ".png";

    public static void main(String args[]) {
        conectarConBBDD();
        sacarListaImagenesBBDD();
        cerrarConexionConBBDD();
    }

    public static String dameElDirectorioTemporalDelSistema() {
        return directorioTemporalDelSistema;
    }

    public static String dameLaBarraDelSistema() {
        return barraDelSistema;
    }

    public static String dameElFormatoDeLaImagen() {
        return formatoDeImagen;
    }

    public static void cerrarConexionQueryEImagen(PreparedStatement queryQueQuieroEjecutar, FileInputStream imagen) {
        try {
            imagen.close();
        } catch (IOException falloAlCerrarLaImagen) {
            System.out.println(falloAlCerrarLaImagen);
        }
        try {
            queryQueQuieroEjecutar.close();
        } catch (SQLException falloAlCerrarLaQuery) {
            System.out.println(falloAlCerrarLaQuery);
        }
    }

    public static void cerrarEscrituraDeImagenEnDisco(FileOutputStream fw, InputStream is) {
        try {
            fw.close();
            is.close();
        } catch (IOException falloAlCerrarLaEscritura) {
            System.out.println(falloAlCerrarLaEscritura);
        }
    }

    public static boolean existeDriverBBDD() {
        boolean existeDriver = false;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            existeDriver = true;
        } catch (ClassNotFoundException elDriverNoSeEncuentra) {
            System.err.println("NO SE ENCUENTRA EL DRIVER" + elDriverNoSeEncuentra);
            existeDriver = false;
        } catch (Exception elDriverNoFunciona) {
            System.out.println("ERROR AL CARGAR CARGAR EL DRIVER" + elDriverNoFunciona);
            existeDriver = false;
        }
        return (existeDriver);
    }

    public static boolean conectarConBBDD() {
        boolean conexionCreada = false;
        if (existeDriverBBDD()) {
            try {
                MysqlDataSource dataSource = new MysqlDataSource();
                dataSource.setUser("root");
                dataSource.setPassword("123456");
                dataSource.setDatabaseName("minipaint");
                dataSource.setServerName("localhost");
                conex = (Connection) dataSource.getConnection();
                conexionCreada = true;
            } catch (Exception conexionfallo) {
                System.out.println(conexionfallo);
                conexionCreada = false;
            }
        }
        return conexionCreada;
    }

    public static boolean cerrarConexionConBBDD() {
        boolean cerrarConexion = false;
        try {
            conex.close();
            cerrarConexion = true;
        } catch (SQLException haFalladoElCerrarLaConexion) {
            System.out.println(haFalladoElCerrarLaConexion);
            cerrarConexion = false;
        }
        return cerrarConexion;
    }

    private static void cerrarConexionQueryYResultSet(Statement queryQueQuieroEjecutar, ResultSet resultados) {
        try {
            queryQueQuieroEjecutar.close();
            resultados.close();
        } catch (SQLException cerrarqueryfallo) {
            System.out.println(cerrarqueryfallo);
        }
    }

    public static void sacarImagenBBDD(String nombreImagen) {
        PreparedStatement queryQueQuieroEjecutar = null;
        Blob bytesImagen = null;
        InputStream is = null;
        FileOutputStream fw = null;
        try {
            queryQueQuieroEjecutar = (PreparedStatement) conex.prepareStatement("SELECT "
                    + "Dibujo FROM DIBUJOS WHERE Dibujo_Nombre = '" + nombreImagen + "'");
            ResultSet resultados = queryQueQuieroEjecutar.executeQuery();
            while (resultados.next()) {
                bytesImagen = (Blob) resultados.getBlob(1);
                is = bytesImagen.getBinaryStream();
            }
            guardarImagenDeBBDDEnDisco(nombreImagen, is, fw);
        } catch (SQLException falloAlExtraerImagenDeBBDD) {
            System.out.println(falloAlExtraerImagenDeBBDD);
        }
    }

    public static void guardarImagenDeBBDDEnDisco(String nombreImagen, InputStream is, FileOutputStream fw) {
        try {
            fw = new FileOutputStream(directorioTemporalDelSistema + barraDelSistema + nombreImagen + formatoDeImagen);
        } catch (FileNotFoundException falloAlLeerImagenDeBBDD) {
            System.out.println(falloAlLeerImagenDeBBDD);
        }
        try {
            byte bytes[] = new byte[512];
            int leidos = is.read(bytes);
            while (leidos > 0) {
                fw.write(bytes);
                leidos = is.read(bytes);
            }
        } catch (IOException falloAlEscribirImagenEnBBDD) {
            System.out.println(falloAlEscribirImagenEnBBDD);
        } finally {
            cerrarEscrituraDeImagenEnDisco(fw, is);
        }
    }

    public static String[] sacarListaImagenesBBDD() {
        String query = "SELECT * FROM Dibujos";
        Statement queryQueQuieroEjecutar = null;
        ResultSet resultados = null;
        List<String> listaDeDibujos = new ArrayList<String>();
        try {
            queryQueQuieroEjecutar = (Statement) conex.createStatement();
            resultados = queryQueQuieroEjecutar.executeQuery(query);
            while (resultados.next()) {
                listaDeDibujos.add(resultados.getString("Dibujo_Nombre"));
            }
        } catch (SQLException queryfallo) {
            System.out.println(queryfallo);
        } finally {
            cerrarConexionQueryYResultSet(queryQueQuieroEjecutar, resultados);
        }
        String[] arrayDeDibujos = new String[listaDeDibujos.size()];
        for (int i = 0; i < arrayDeDibujos.length; i++) {
            arrayDeDibujos[i] = listaDeDibujos.get(i);
        }
        return (arrayDeDibujos);
    }

    public static boolean guardarImagenEnBBDD(String nombreImagen) {
        boolean seHaGuardadoLaImagenEnLaBBDD = false;
        boolean laImagenExisteEnElDisco = false;
        File Imagen = new File(directorioTemporalDelSistema + barraDelSistema + nombreImagen + formatoDeImagen);
        FileInputStream imagen = null;
        PreparedStatement queryQueQuieroEjecutar = null;
        try {
            imagen = new FileInputStream(Imagen);
            laImagenExisteEnElDisco = true;
        } catch (IOException falloAlLeerLaImagen) {
            System.out.println(falloAlLeerLaImagen);
            laImagenExisteEnElDisco = false;
        }
        try {
            queryQueQuieroEjecutar = (PreparedStatement) conex.prepareStatement(
                    "INSERT INTO DIBUJOS (DIBUJO_NOMBRE, DIBUJO)"
                    + " VALUES ('" + nombreImagen + "', ?)");
            queryQueQuieroEjecutar.setBlob(1, imagen);
            queryQueQuieroEjecutar.execute();
            seHaGuardadoLaImagenEnLaBBDD = true;
        } catch (SQLException falloAlGuardarImagen) {
            System.out.println(falloAlGuardarImagen);
            seHaGuardadoLaImagenEnLaBBDD = false;
        } finally {
            cerrarConexionQueryEImagen(queryQueQuieroEjecutar, imagen);
        }
        return (laImagenExisteEnElDisco && seHaGuardadoLaImagenEnLaBBDD);
    }

    public static boolean borrarImagenDeBBDD(String nombreImagen) {
        boolean seHaBorradoLaImagenDeLaBBDD = false;
        PreparedStatement queryQueQuieroEjecutar = null;
        try {
            queryQueQuieroEjecutar = (PreparedStatement) conex.prepareStatement("DELETE "
                    + "FROM DIBUJOS WHERE Dibujo_Nombre = '" + nombreImagen + "'");
            queryQueQuieroEjecutar.execute();
            queryQueQuieroEjecutar.close();
            seHaBorradoLaImagenDeLaBBDD = true;
        } catch (SQLException elBorradoDeLaImagenDeLaBBDDHaFallado) {
            System.out.println(elBorradoDeLaImagenDeLaBBDDHaFallado);
            seHaBorradoLaImagenDeLaBBDD = false;
        }
        return (seHaBorradoLaImagenDeLaBBDD);
    }

    public static boolean borrarImagenDeDisco(String nombreImagen) {
        boolean seHaBorradoLaImagenDelDisco = false;
        try {
            File imagen = new File(directorioTemporalDelSistema + barraDelSistema + nombreImagen + formatoDeImagen);
            imagen.delete();
            seHaBorradoLaImagenDelDisco = true;
        } catch (Exception elBorradoDeLaImagenDelDiscoHaFallado) {
            System.out.println(elBorradoDeLaImagenDelDiscoHaFallado);
            seHaBorradoLaImagenDelDisco = false;
        }
        return (seHaBorradoLaImagenDelDisco);
    }
}
